﻿using System;
using System.Reflection;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using TPDiseño.Clases_de_Control;
using TPDiseño.Clases_de_Entidad;
using TPDiseño.DTO_s;
using GridviewToExcel;


namespace TPDiseño.Interfaces
{
    // Delegados
    public delegate void FinishEvaluarCand2EventHandler(object sender, System.EventArgs e); // Delegado encargado para manejar evento terminar
    public delegate void ExportarEvaluarCand2EventHandler(object sender, System.EventArgs e); // Delegado encargado para manejar evento terminar

    public partial class EvaluarCand2 : Form
    {
        // Eventos
        public event FinishEvaluarCand2EventHandler   terminar; // Evento terminar
        public event ExportarEvaluarCand2EventHandler exportarEvento; // Evento terminar

        // Atributos
        /********************************************************************/
        // Gestores
        private Gestor_de_Puesto miGestor_de_Puesto = new Gestor_de_Puesto();
        private Gestor_Evaluacion miGestor_Evaluacion = new Gestor_Evaluacion();
        
        // Librerias
        private export2Excel miEportarEcel;

        // Objetos de entrada que maneja el formulario
        private List<DTO_s.DTOCandidatoResult> misCandidatosParaEvaluar;
        // Objetos de Salida
        private List<DTO_s.DTOCandidatoClave> misCandidatosConClaveParaEvaluar;
        
        
          // Administrador del evento termino
        public void termino(List<DTOCandidatoClave> unosCandidatosClaves)
        {
            // Creo el DTOCandidatoClave con Argumentos...
            DTOCandidatoClaveArgumento e = new DTOCandidatoClaveArgumento(unosCandidatosClaves);
            // Disparo el evento
            terminar(this, e);
        }

        // Administrador del evento termino
        public void exportaDisparo(DataGridView unaGrillaDeCandidatosClaves, string unaRutaDeCarpeta)
        {
            // Creo el DTOCandidatoClave con Argumentos...
            CandidatosClavesParaExportarArgumentos e = new CandidatosClavesParaExportarArgumentos(unaGrillaDeCandidatosClaves, unaRutaDeCarpeta);
            // Disparo el evento
            exportarEvento(this, e);
        }
        
        // Constructores
        public EvaluarCand2()
        {
            InitializeComponent();
        }


        public EvaluarCand2(List<DTO_s.DTOCandidatoResult> unCandidatosParaEvaluar)
        {
            InitializeComponent();

            // Registro el DTO de los candidatos a evaluar
            misCandidatosParaEvaluar = unCandidatosParaEvaluar;
            
        }


        // Metodos 
        public void cargar(object sender, EventArgs e)
        {
            
            // Obtengo la clave de los candidatos a evaluar en el DTOCandidatosClave, atra vez del gestor de evaluacion
            misCandidatosConClaveParaEvaluar = miGestor_Evaluacion.generarClave(misCandidatosParaEvaluar);
            
                      
            //Recorro los candidatos buscados para agregarlos al biding de la grilla
            foreach (DTO_s.DTOCandidatoClave unCandidatoClave in misCandidatosConClaveParaEvaluar)
            {
                // Agrego uno a uno al binding
                bindingSourceDTOCandidatoClave.Add(unCandidatoClave);

            }

            //DataGridViewCandidatoClave.ClearSelection();                     
         
        }

        
        // Genera un DataView con los datos de la grillas
        public DataView ToDataView(DataGridView dataGridView, string tableName)
        {
            var dgv = dataGridView;
            var table = new System.Data.DataTable(tableName);

            // Crea las columnas 
            for (var iCol = 0; iCol < dgv.Columns.Count; iCol++)
            {
                table.Columns.Add(dgv.Columns[iCol].HeaderText);
            }

            // Agrega las filas 
            for (var i = 0; i < dgv.Rows.Count; i++)
            {
                // Obtiene el DataBound de la fila y copia los valores de la fila 
                DTOCandidatoClave unCandidato = (DTOCandidatoClave)dgv.Rows[i].DataBoundItem;
                      
                // Agrega la fila clonada                 
                table.Rows.Add(unCandidato.toArray());
            }

            return table.DefaultView;
        }
           

        private void ButtonFinalizar_Click(object sender, EventArgs e)
        {                                               
            // Si elije exportar los resultados...
            if (MessageBox.Show("¿Quiere exportar los resultados a excel?", "Exportar Resultados", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                // Si ya elijio en que carpeta exportar
                if (folderBrowserDialogExportar.ShowDialog() == DialogResult.OK)
                {
                    // Disparo evento de exportar
                    exportaDisparo(DataGridViewCandidatoClave, folderBrowserDialogExportar.SelectedPath);

                }
            }
                              
            
            // Invoco el administrador del evento terminar para que lo dispare !!
            termino(misCandidatosConClaveParaEvaluar);
        }

        private void ButtonCancelar_Click(object sender, EventArgs e)
        {
            // Cierro el formulario
            this.Close();
        }

     
    }
}
